如何实现MDL锁以及有哪些获取机制

您所在的位置:网站首页 阿里 rds matadata lock 如何实现MDL锁以及有哪些获取机制

如何实现MDL锁以及有哪些获取机制

#如何实现MDL锁以及有哪些获取机制| 来源: 网络整理| 查看: 265

MDL_context

一个线程获取MDL锁的上下文,每个连接都对应一个,包含了该连接获取到的所有MDL_ticket。按照不同的生命周期存放在各自的链表中,由MDL_ticket_store管理。

一个连接获得的所有锁根据生命周期可以划分为三种:语句级、事务级和显式锁。语句级和事务级的锁都是具有自动的生命周期和作用范围,它们在一个事务过程中进行积累。语句级的锁在最外层的语句结束后自动释放,事务级的锁在COMMIT、ROLLBACK和ROLLBACK TO SAVEPOINT之后释放,它们不会被手动释放。具有显式生命周期的ticket是为了跨事务和checkpoint的锁所获取的,包括HANDLER SQL locks、LOCK TABLES locks和用户级的锁GET_LOCK()/RELEASE_LOCK()。语句级和事务级的锁会按照时间顺序的反序被加到对应链表的前面,当回滚到某一检查点时,就会从链表的前面将对应的ticket释放出栈,直到检查点创建前最后一个获取到的ticket。

当一个线程想要获取某个MDL锁时,会优先在自己的MDL_ticket_store中查找是否在事务内已经获取到相同锁对象更强类型的MDL_ticket。因此MDL_ticket_store会提供根据MDL_request请求查找MDL_ticket的接口,一种是在不同生命周期的MDL_ticket链表中查找。如果当前线程获取的MDL_ticket数量超过阈值(默认256),会将所有的MDL_ticket维护在额外的std::unordered_multimap中,来加速查找。

MDL_ticket_store::MDL_ticket_handle MDL_ticket_store::find( const MDL_request &req) const { #ifndef DBUG_OFF if (m_count >= THRESHOLD) { MDL_ticket_handle list_h = find_in_lists(req); MDL_ticket_handle hash_h = find_in_hash(req); DBUG_ASSERT(equivalent(list_h.m_ticket, hash_h.m_ticket, req.duration)); } #endif /*! DBUG_OFF */ return (m_map == nullptr || m_count < THRESHOLD) ? find_in_lists(req) : find_in_hash(req); }


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3